# GoCalculator
Распределенный вычислитель арифметических выражений на Golang

## Introduction  
### Условия задачи
---
Продолжаем работу над проектом Распределенный калькулятор. В этой части работы над проектом реализуем персистентность (возможность программы восстанавливать свое состояние после перезагрузки) и многопользовательский режим. Простыми словами все, что мы делали до этого теперь будет работать в контексте пользователей, а все данные будут храниться в СУБД.

**Функционал приложения**
1. Добавляем регистрацию и авторизацию пользователя.
  - Регистрация пользователя:
    - Пользователь отправляет запрос
      ```bash
      POST /api/v1/register {
      "login": ,
      "password":
      }
      ```
    - В отве т получае `200+OK` (в случае успеха). В противном случае - ошибка
  - Добавляем вход
    - Пользователь отправляет запрос
      ```bash
      POST /api/v1/login {
      "login": ,
      "password":
      }
      ```
    - В ответ получае `200+OK` и `JWT токен` для последующей авторизации.

Весь реализованный ранее функционал работает как раньше, только в контексте конкретного пользователя.
За эту часть можно получить **20 баллов**.

2. У кого выражения хранились в памяти - переводим хранение в SQLite. (теперь наша система обязана переживать перезагрузку)
За эту часть можно получить **20 баллов**.

3. У кого общение вычислителя и сервера вычислений было реализовано с помощью HTTP - переводим взаимодействие на GRPC
За эту часть можно получить **10 баллов**.

4. Дополнительные баллы:
  - за покрытие проекта модульными тестами можно получить бонусные **10 баллов**
  - за покрытие проекта интеграционными тестами можно получить бонусные **10 баллов**

## Summary
### Что сделано по задаче
1. Реализована регистрация и авторизация пользователя. При отправке выражений проверяется достоверность пользователя с помощью `JWT токена`. Если пользователь проверку не прошел, то он не получит доступ к работе с backtnd-ом и отправляемые им данные не будут сохраняться в базе данных и отправляться для вычисления (+20 баллов).
2. На backend-е все данные сохраняются в базе данных, приложение восстанавливает свое состояние при перезагрузке (+20 баллов).

### Использование проекта  
Для проверки работы проекта необходимо, после старта проекта, в браузере открыть две вкладки по указанным адресам запуска: web-сервера (http://127.0.0.1:8080) и вычислителя (http://127.0.0.1:8085/start).  
1. Web-сервер запуститься по адресу http://127.0.0.1:8080
  - На web-сервере будет одна страница. После регистрации станет доступна страница с формой для отправки выражений. Под формой будет отображаться список отправленных выражений, который будет обновляться с интервалом в 10 секунд. (TODO: Во второй вкладке будут указаны вычисленные выражения. В третьей вкладке будут указаны не валидные выражения).
  - Сервер считает арифметически верно составленные выражения, состоящие из чисел, скобок и операторов "__+ - * /__"
2. Вычислитель запустится по адресу http://127.0.0.1:8085
  - Для проверки работы вычислителя необходимо перейти по адресу http://127.0.0.1:8085/start (при переходе по данному пути или при обновлении вкладки браузера на данном пути, из вычислителя будет отправлен GET запрос в оркестратор, для получения валидного выражения, затем вычисление будет вычислено и будет отправлен POST запрос в оркестратор с результатом вычисления.  
  __!!! ВАЖНО:__ для получения и отправки одного выражения из оркестратора нужно обновить страницу вычислителя __ОДИН РАЗ!!!__).
3. Алгоритм проверки работоспособности распределенного калькулятора:
  - Ввести в форме web-сервера выражение и нажать кнопку "Send" (можно поочередно отправить несколько выражений, так даже интереснее). Отправленное выражение отобразится под формой, у него дополнительно будет указан статус (error, valid, ok) и краткое описание. Когда выражение будет посчитано, то оно будет отображаться с решением указанным через знак "=". 
  - Перейти на вкладку вычислителя по адресу http://127.0.0.1:8085/start и обновить страницу (при первом открытии вкладки обновлять страницу не нужно). Перед отправкой выражения вычислителю оркестратор устанавливает ему статус `in_progress`.
  - Вернуться на вкладку web-сервера и подождать обновления состояний выражений (интервал обновлений 10 секунд, состояния обновляются автоматически). Web-сервер запросит актуальные данные с оркестратора и отобразит их на странице (TODO: в том числе распределит их по вкладкам в зависимости от статуса выражений).
  - Повторить пункты по порядку с начала.
